package com.gftBrazil.BankSystem.view;

import com.gftBrazil.BankSystem.bean.AgenciaBean;
import com.gftBrazil.BankSystem.bean.ClienteBean;
import com.gftBrazil.BankSystem.bean.ClienteFisicoBean;
import com.gftBrazil.BankSystem.bean.ClienteJuridicoBean;
import com.gftBrazil.BankSystem.bean.enums.EstadoCliente;
import com.gftBrazil.BankSystem.bean.enums.Permissao;
import com.gftBrazil.BankSystem.bean.enums.UnidadeFederativa;
import com.gftBrazil.BankSystem.business.AgenciaBusiness;
import com.gftBrazil.BankSystem.business.ClienteBusiness;
import com.gftBrazil.BankSystem.controller.cliente.ClienteFisicoController;
import com.gftBrazil.BankSystem.controller.cliente.ClienteJuridicoController;
import com.gftBrazil.BankSystem.exceptions.AcessoNegadoException;
import com.gftBrazil.BankSystem.util.Ambiente;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author JRSS
 */
public class MDIPrincipal extends javax.swing.JFrame {

    /**
     * Creates new form Principal
     */
    public MDIPrincipal() {
        initComponents();
        Ambiente.getInstance().setDesktopPane(desktopPane);
        initListeners();
        carregarAgencias();
        carregarClientes();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        desktopPane = new javax.swing.JDesktopPane();
        menuBar = new javax.swing.JMenuBar();
        menuAgencias = new javax.swing.JMenu();
        cadastrarAgenciaMenuItem = new javax.swing.JMenuItem();
        visualizarAgenciaMenuItem = new javax.swing.JMenuItem();
        desativarAgenciaMenuItem = new javax.swing.JMenuItem();
        reativarAgenciaMenuItem = new javax.swing.JMenuItem();
        consultarAgenciasMenuItem = new javax.swing.JMenuItem();
        menuClientes = new javax.swing.JMenu();
        cadastrarClienteFisicoMenuItem = new javax.swing.JMenuItem();
        cadastrarClienteJuridicoMenuItem = new javax.swing.JMenuItem();
        visualizarClienteMenuItem = new javax.swing.JMenuItem();
        alterarClienteMenuItem = new javax.swing.JMenuItem();
        bloquearClienteMenuItem = new javax.swing.JMenuItem();
        cancelarClienteMenuItem = new javax.swing.JMenuItem();
        reativarClienteMenuItem = new javax.swing.JMenuItem();
        consultarClienteMenuItem = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setPreferredSize(new java.awt.Dimension(900, 600));

        menuAgencias.setMnemonic('f');
        menuAgencias.setText("Agencias");

        cadastrarAgenciaMenuItem.setMnemonic('o');
        cadastrarAgenciaMenuItem.setText("Cadastrar agencia");
        menuAgencias.add(cadastrarAgenciaMenuItem);

        visualizarAgenciaMenuItem.setMnemonic('s');
        visualizarAgenciaMenuItem.setText("Visualizar agencia");
        menuAgencias.add(visualizarAgenciaMenuItem);

        desativarAgenciaMenuItem.setMnemonic('x');
        desativarAgenciaMenuItem.setText("Desativar agencia");
        menuAgencias.add(desativarAgenciaMenuItem);

        reativarAgenciaMenuItem.setMnemonic('a');
        reativarAgenciaMenuItem.setText("Reativar agencia");
        menuAgencias.add(reativarAgenciaMenuItem);

        consultarAgenciasMenuItem.setText("Consultar agencias");
        menuAgencias.add(consultarAgenciasMenuItem);

        menuBar.add(menuAgencias);

        menuClientes.setMnemonic('e');
        menuClientes.setText("Clientes");

        cadastrarClienteFisicoMenuItem.setMnemonic('t');
        cadastrarClienteFisicoMenuItem.setText("Cadastrar cliente fisico");
        menuClientes.add(cadastrarClienteFisicoMenuItem);

        cadastrarClienteJuridicoMenuItem.setMnemonic('y');
        cadastrarClienteJuridicoMenuItem.setText("Cadastrar cliente juridico");
        menuClientes.add(cadastrarClienteJuridicoMenuItem);

        visualizarClienteMenuItem.setMnemonic('p');
        visualizarClienteMenuItem.setText("Visualizar cliente");
        menuClientes.add(visualizarClienteMenuItem);

        alterarClienteMenuItem.setMnemonic('d');
        alterarClienteMenuItem.setText("Alterar cliente");
        menuClientes.add(alterarClienteMenuItem);

        bloquearClienteMenuItem.setText("Bloquear cliente");
        menuClientes.add(bloquearClienteMenuItem);

        cancelarClienteMenuItem.setText("Cancelar cliente");
        menuClientes.add(cancelarClienteMenuItem);

        reativarClienteMenuItem.setText("Reativar cliente");
        menuClientes.add(reativarClienteMenuItem);

        consultarClienteMenuItem.setText("Consultar cliente");
        menuClientes.add(consultarClienteMenuItem);

        menuBar.add(menuClientes);

        setJMenuBar(menuBar);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 584, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 447, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MDIPrincipal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                LoginView login = new LoginView(null, true);
                login.setLocationRelativeTo(null);
                login.setVisible(true);
                login.toFront();
                if (Ambiente.getUsuario().getPermissoes() != null) {
                    MDIPrincipal menu = new MDIPrincipal();
                    menu.setLocationRelativeTo(null);
                    menu.setVisible(true);
                    menu.toFront();
                }
            }
        });
    }

    private void initListeners() {
        this.cadastrarAgenciaMenuItem.addActionListener(trataBotoes);
        this.visualizarAgenciaMenuItem.addActionListener(trataBotoes);
        this.desativarAgenciaMenuItem.addActionListener(trataBotoes);
        this.reativarAgenciaMenuItem.addActionListener(trataBotoes);
        this.consultarAgenciasMenuItem.addActionListener(trataBotoes);

        this.cadastrarClienteFisicoMenuItem.addActionListener(trataBotoes);
        this.cadastrarClienteJuridicoMenuItem.addActionListener(trataBotoes);
        this.visualizarClienteMenuItem.addActionListener(trataBotoes);
        this.alterarClienteMenuItem.addActionListener(trataBotoes);
        this.bloquearClienteMenuItem.addActionListener(trataBotoes);
        this.cancelarClienteMenuItem.addActionListener(trataBotoes);
        this.reativarClienteMenuItem.addActionListener(trataBotoes);
        this.consultarClienteMenuItem.addActionListener(trataBotoes);
    }

    private class TrataBotoes implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent ae) {
            boolean novaAgencia;
            if (ae.getSource() == cadastrarAgenciaMenuItem) {
                novaAgencia = true;
                AgenciaView agenciaView = new AgenciaView(novaAgencia);
                agenciaView.setVisible(true);
                agenciaView.toFront();
                desktopPane.add(agenciaView);
            } else if (ae.getSource() == visualizarAgenciaMenuItem
                    || ae.getSource() == desativarAgenciaMenuItem
                    || ae.getSource() == reativarAgenciaMenuItem) {
                novaAgencia = false;
                AgenciaView agenciaView = new AgenciaView(novaAgencia);
                agenciaView.setVisible(true);
                agenciaView.toFront();
                desktopPane.add(agenciaView);
            } else if (ae.getSource() == cadastrarClienteFisicoMenuItem) {
                try {
                    boolean novoCliente = true;
                    ClienteView clienteView = new ClienteView(novoCliente, new ClienteFisicoBean());
                    ClienteFisicoController controller = new ClienteFisicoController(Permissao.CADASTRAR_CLIENTE);
                    controller.visualizar(clienteView, new ClienteFisicoBean(), true);
                } catch (AcessoNegadoException ex) {
                    JOptionPane.showMessageDialog(Ambiente.getInstance().getDesktopPane(),
                            ex.toString(), "Erro", JOptionPane.ERROR_MESSAGE);
                }
            } else if (ae.getSource() == cadastrarClienteJuridicoMenuItem) {
                try {
                    boolean novoCliente = true;
                    ClienteView clienteView = new ClienteView(novoCliente, new ClienteJuridicoBean());
                    ClienteJuridicoController controller = new ClienteJuridicoController(Permissao.CADASTRAR_CLIENTE);
                    controller.visualizar(clienteView, new ClienteJuridicoBean(), true);
                } catch (AcessoNegadoException ex) {
                    JOptionPane.showMessageDialog(Ambiente.getInstance().getDesktopPane(),
                            ex.toString(), "Erro", JOptionPane.ERROR_MESSAGE);
                }
            } else if (ae.getSource() == visualizarClienteMenuItem
                    || ae.getSource() == alterarClienteMenuItem
                    || ae.getSource() == bloquearClienteMenuItem
                    || ae.getSource() == cancelarClienteMenuItem
                    || ae.getSource() == reativarClienteMenuItem) {
                try {
                    boolean novoCliente = false;
                    ClienteView clienteView = new ClienteView(novoCliente);
                    ClienteFisicoController controller = new ClienteFisicoController(Permissao.CONSULTAR_CLIENTE);
                    controller.visualizar(clienteView, new ClienteFisicoBean(), false);
                } catch (AcessoNegadoException ex) {
                    JOptionPane.showMessageDialog(Ambiente.getInstance().getDesktopPane(),
                            ex.toString(), "Erro", JOptionPane.ERROR_MESSAGE);
                }
            } else if (ae.getSource() == consultarClienteMenuItem) {
                ConsultaClienteView consultaClienteView = new ConsultaClienteView();
                consultaClienteView.setVisible(true);
                consultaClienteView.toFront();
                desktopPane.add(consultaClienteView);
            }
        }
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem alterarClienteMenuItem;
    private javax.swing.JMenuItem bloquearClienteMenuItem;
    private javax.swing.JMenuItem cadastrarAgenciaMenuItem;
    private javax.swing.JMenuItem cadastrarClienteFisicoMenuItem;
    private javax.swing.JMenuItem cadastrarClienteJuridicoMenuItem;
    private javax.swing.JMenuItem cancelarClienteMenuItem;
    private javax.swing.JMenuItem consultarAgenciasMenuItem;
    private javax.swing.JMenuItem consultarClienteMenuItem;
    private javax.swing.JMenuItem desativarAgenciaMenuItem;
    private javax.swing.JDesktopPane desktopPane;
    private javax.swing.JMenu menuAgencias;
    private javax.swing.JMenuBar menuBar;
    private javax.swing.JMenu menuClientes;
    private javax.swing.JMenuItem reativarAgenciaMenuItem;
    private javax.swing.JMenuItem reativarClienteMenuItem;
    private javax.swing.JMenuItem visualizarAgenciaMenuItem;
    private javax.swing.JMenuItem visualizarClienteMenuItem;
    // End of variables declaration//GEN-END:variables

    private final TrataBotoes trataBotoes = new TrataBotoes();

    private void carregarAgencias() {
        List<AgenciaBean> agencias = new ArrayList<>();
        AgenciaBean a;
        for (int i = 0; i < 5; i++) {
            a = new AgenciaBean();
            a.setCodigoAgencia(i + 1);
            a.setNome("Agencia " + (i + 1));
            a.setCnpj("12.345.678/9123-45" + (i + 1));
            a.setEndereco("Rua " + (i + 1));
            a.setAtiva(true);
            agencias.add(a);
        }
        AgenciaBusiness.getInstance().setAgencias(agencias);
    }

    private void carregarClientes() {
        List<ClienteBean> clientes = new ArrayList<>();
        ClienteBean c;
        StringBuilder sb;
        for (int i = 0; i < 10; i++) {
            sb = new StringBuilder(" ");
            sb.append(new Character((char) (i + 65)));
            if (i % 2 == 0) {
                c = new ClienteFisicoBean();
                c.setDocumento("337.636.988.76");
            } else {
                c = new ClienteJuridicoBean();
                c.setDocumento("12.345.678/9123-45");
            }
            c.setCodigoCliente(i + 1);
            c.setNome("Nome " + sb.toString());
            c.setCidade("jump City");
            c.setUnidadeFederativa(UnidadeFederativa.SP);
            c.setEstadoCliente(EstadoCliente.ATIVO);
            clientes.add(c);
        }
        ClienteBusiness.setClientes(clientes);
    }
}
